symlink関数は、既存ファイルやディレクトリに対して、別名(シンボリック・リンク)を作成します。
リンクにはハード・リンクとシンボリック・リンク(又はソフト・リンク)があります。ハード・リンクはファイル・システムを超えて作成できませんし、ディレクトリに対しても作成できません。これに対して、シンボリック・リンクにはこれらの制限はありません。ハード・リンクに付いてはlink関数をご覧ください。
この関数は、C言語のライブラリ関数(標準関数)ではありませんので、コンパイラにより、使えない場合があります。
#include <unistd.h>
int symlink(const char *oldpath, const char *newpath);
*oldpathは既存ファイルやディレクトリをパス名で指定します。
*newpathは別名をパス名で指定します。
戻り値として、処理が成功した場合は0が、エラーの場合は-1を返します。
第1引数の*oldpathを相対パス名で指定する場合は、第2引数の*newpathを起点とした相対パス名になります。
プログラム 例
#include <stdio.h> #include <unistd.h> int main(int argc, char **argv) { int return_code = 0; if (argc == 3) { /* シンボリック・リンクを作る */ if (symlink(*(argv + 1), *(argv + 2)) == 0) { printf('%sを作成しました\n', *(argv + 2)); } else { printf('%sを作成できませんでした\n', *(argv + 2)); perror(''); return_code = 1; } } else { printf('実行時引数の数が不当です\n'); return_code = 2; } return return_code; }
例の実行結果
$ pwd /home/user/TMP/WORK $ ls -ld temp_1.txt DIR1 DIR2 drwxr-xr-x 2 user users 4096 2008-08-11 17:10 DIR1 drwxr-xr-x 2 user users 4096 2008-08-11 17:17 DIR2 -rw-r--r-- 1 user users 20 2008-07-04 09:03 temp_1.txt $ $ ./symlink.exe $PWD/temp_1.txt DIR2/temp_1_link1.txt DIR2/temp_1_link1.txtを作成しました $ $ cd DIR2 $ ../symlink.exe ../temp_1.txt temp_1_link2.txt temp_1_link2.txtを作成しました $ $ ../symlink.exe ../DIR1 DIR1_LINK DIR1_LINKを作成しました $ $ ls -l 合計 4 lrwxrwxrwx 1 user users 7 2008-08-11 17:38 DIR1_LINK -> ../DIR1 lrwxrwxrwx 1 user users 31 2008-08-11 17:35 temp_1_link1.txt -> /home/user/TMP/WORK/temp_1.txt lrwxrwxrwx 1 user users 13 2008-08-11 17:36 temp_1_link2.txt -> ../temp_1.txt -rw-r--r-- 1 user users 75 2008-07-02 11:09 temp_3.txt $ cat temp_1_link1.txt Hello World!!. Bye. $ ls -l DIR1_LINK lrwxrwxrwx 1 user users 7 2008-08-11 17:38 DIR1_LINK -> ../DIR1 $ ls -Ll DIR1_LINK 合計 12 -rwxr-xr-x 1 user users 39 2008-07-29 10:13 hello_1.sh -rw-r--r-- 1 user users 39 2008-07-29 10:43 hello_2.sh -rw-r--r-- 1 user users 20 2008-07-04 09:03 link_1.txt $